﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using blacksoft.Models;
using blacksoft.Constantes;

namespace blacksoft.Controllers
{
    public class OrdenCompraController : Controller
    {
        private inf245travelbusEntities db = new inf245travelbusEntities();

        // GET: /OrdenCompra/
        public ActionResult Index()
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------
            var ordencompra = db.OrdenCompra.Include(o => o.Persona).Include(o => o.Terminal);
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            //Local session
            int idTerminal;
            if (!global)
            {
                idTerminal = (int)Session["IDTerminal"];
                ordencompra = ordencompra.Where(oc => oc.IDTerminal == idTerminal);
            }  
            ordencompra = ordencompra.Where(s => s.Estado != "IN");
            return View(ordencompra.ToList());
        }

        // GET: /OrdenCompra/Details/5
        public ActionResult Details(int? id)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------
            var dbOrdenCompraDetalle = from d in db.Detalle_OrdenCompra
                                      where d.IDOrdenCompra == id
                                      select d;
            List<Detalle_OrdenCompra> lOCD = dbOrdenCompraDetalle.ToList();
            ViewBag.OCTablaDetalle =  new List<List<string>>();
            for(int i=0; i<lOCD.Count(); i++){
                List<string> row = new List<string>();
                row.Add(lOCD[i].Producto.Nombre);
                row.Add(lOCD[i].Precio.ToString());
                row.Add(lOCD[i].Cantidad.ToString());
                row.Add(lOCD[i].Subtotal.ToString());
                ViewBag.OCTablaDetalle.Add(row);
            }
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            OrdenCompra ordencompra = db.OrdenCompra.Find(id);
            if (ordencompra.Estado == "AC") { 
                ViewBag.strEstado = "ACTIVO";
            }else if(ordencompra.Estado == "IN"){
                ViewBag.strEstado = "INACTIVO";
            }else if(ordencompra.Estado == "PG"){
                 ViewBag.strEstado = "Pagado";
            }else if(ordencompra.Estado == "RG"){
                ViewBag.strEstado = "REGISTRADO";
            }

            if (ordencompra == null)
            {
                return HttpNotFound();
            }


            return View(ordencompra);
        }

        // GET: /OrdenCompra/Create
        public ActionResult Create(string accion, string searchNombre, string searchCodigo, string action, string scantidad, string sIDPProveedor, string IDPersona_Proveedor)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------

            var dbProveedores = from p in db.Persona
                                where p.TipoPersona == 1
                                orderby p.RUC
                                select p;
            List<Persona> dbProveedoresList = dbProveedores.ToList();
            for (int i = 0; i < dbProveedoresList.Count(); i++)
            {
                dbProveedoresList[i].RazonSocial = dbProveedoresList[i].RUC + " " + dbProveedoresList[i].RazonSocial;
            }
            ViewBag.IDPersona_Proveedor = new SelectList(dbProveedoresList, "IDPersona", "RazonSocial");
            ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre");
            ViewBag.infoProductoNombre = "Producto";
            ViewBag.infoProductoPrecio = "";
            ViewBag.infoProductoUnidad = "";

            if (Session["ordenCompraProveedorRS"] == null)
            {
                Session["ordenCompraProveedorRS"] = String.Empty;
            }

            if (Session["ordenCompraProveedorID"] == null)
            {
                Session["ordenCompraProveedorID"] = -1;
            }

            if (Session["ordenCompraProductoSeleccionadoFlag"] == null)
            {
                Session["ordenCompraProductoSeleccionadoFlag"] = false;
            }

            if (Session["listaCompraDetalle"] == null) {
                Session["listaCompraDetalle"] = new List<Detalle_OrdenCompra>();
                Session["ordenCompraSubtotal"] = 0;
            }
       
            List<Producto_x_Proveedor> listProducto;
            var producto_x_proveedor = db.Producto_x_Proveedor.Include(p => p.Persona).Include(p => p.Producto);
            switch (accion) { 
                case "reset":
                    Session["ordenCompraProveedorRS"] = null;
                    Session["ordenCompraProveedorID"] = -1;
                    Session["listaCompraDetalle"] = new List<Detalle_OrdenCompra>();
                    Session["ordenCompraProveedorRS"] = "Seleccione";
                    Session["MODCOMP_ordenCompra_create_state"] = "0";
                    break;
                case "seleccionar":
                    int tmpIdProveedorS;
                    try { tmpIdProveedorS = Int32.Parse(IDPersona_Proveedor); }
                    catch{
                        TempData["create_failure"] = "Seleccione un Proveedor";
                        break;
                    }
                    Session["ordenCompraProveedorID"] = tmpIdProveedorS;
                    var dbProov = from p in db.Persona
                                  where p.IDPersona == tmpIdProveedorS
                                  select p;
                    List<Persona> tmpListPersona;
                    tmpListPersona = dbProov.ToList();
                    Session["ordenCompraProveedorRS"] = tmpListPersona.ElementAt(0).RazonSocial;
                    Session["MODCOMP_ordenCompra_create_state"] = "1";
                    break;
                case "buscar":
                    if (!String.IsNullOrEmpty(searchNombre))
                    {
                        int tmpIdProveedor = ((int?)Session["ordenCompraProveedorID"]).Value;
                        var ProductosProv = from m in db.Producto_x_Proveedor
                                            select m;
                        ProductosProv = ProductosProv.Where(p => p.Producto.Nombre.Contains(searchNombre));
                        ProductosProv = ProductosProv.Where(x => x.IDPersona == tmpIdProveedor);
                        listProducto = ProductosProv.ToList();

                        if (listProducto.Count() > 0)
                        {
                            Session["MODCOMP_ordenCompra_create_state"] = "2";
                            Session["ordenCompraProductoSeleccionado"] = listProducto.ElementAt(0);
                            ViewBag.infoProductoNombre = listProducto.ElementAt(0).Producto.Nombre;
                            ViewBag.infoProductoPrecio = listProducto.ElementAt(0).Precio.ToString();
                            ViewBag.infoProductoUnidad = listProducto.ElementAt(0).Producto.UnidadMedida;
                            Session["ordenCompraProductoSeleccionadoFlag"] = true;
                        }
                    }
                    break;
                case "agregar":
                    bool seleccionado = (bool)Session["ordenCompraProductoSeleccionadoFlag"];
                    if (seleccionado)
                    {
                        int cantidad;
                        try
                        {
                            cantidad = Int32.Parse(scantidad);
                            if (cantidad <= 0)
                            {
                                TempData["create_failure"] = "Ingrese una cantidad positiva";
                                break;
                            }
                            Session["MODCOMP_ordenCompra_create_state"] = "3";
                            Detalle_OrdenCompra nDetalleOrdenCompra = new Detalle_OrdenCompra();
                            nDetalleOrdenCompra.IDProducto = ((Producto_x_Proveedor)Session["ordenCompraProductoSeleccionado"]).IDProducto;
                            nDetalleOrdenCompra.Cantidad = cantidad;
                            nDetalleOrdenCompra.Precio = ((Producto_x_Proveedor)Session["ordenCompraProductoSeleccionado"]).Precio;
                            nDetalleOrdenCompra.Subtotal = cantidad * ((Producto_x_Proveedor)Session["ordenCompraProductoSeleccionado"]).Precio;
                            ((List<Detalle_OrdenCompra>)Session["listaCompraDetalle"]).Add(nDetalleOrdenCompra);
                        }catch{}

                    }
                    break;
                default:
                    break;
            }
            ViewBag.tabla = new List<List<string>>();
            for (int i = 0; i < ((List<Detalle_OrdenCompra>)Session["listaCompraDetalle"]).Count(); i++)
            {
                List<string> row = new List<string>();
                //Buscamos nombre del producto
                int tmpIdProducto = ((List<Detalle_OrdenCompra>)Session["listaCompraDetalle"]).ElementAt(i).IDProducto.Value;
                var tmpDbProducto = from p in db.Producto
                                    where p.IDProducto == tmpIdProducto
                                    select p;
                Producto myProduct = tmpDbProducto.ToList().ElementAt(0);
                row.Add(myProduct.Nombre);
                row.Add(((List<Detalle_OrdenCompra>)Session["listaCompraDetalle"]).ElementAt(i).Precio.ToString());
                row.Add(((List<Detalle_OrdenCompra>)Session["listaCompraDetalle"]).ElementAt(i).Cantidad.ToString());
                row.Add(((List<Detalle_OrdenCompra>)Session["listaCompraDetalle"]).ElementAt(i).Subtotal.ToString());
                ViewBag.tabla.Add(row);
            }
            ViewBag.proveedor = (string)Session["ordenCompraProveedorRS"];
            return View();
        }



        // POST: /OrdenCompra/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "IDOrdenCompra,Fecha,Subtotal,IGV,Total,Estado,IDPersona_Proveedor,IDTerminal")] OrdenCompra ordencompra)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------

            // ****  GET ID Terminal    ****
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            int idTerminal = (int)Session["IDTerminal"];  
            // ------              --------

            // **** VERIFICAR TABLA LLENA ***
            string state = (string)Session["MODCOMP_ordenCompra_create_state"];
            if (!state.Equals("3"))
            {
                ViewBag.proveedor = "Seleccione";
                ViewBag.tabla = new List<List<string>>();
                var dbProveedores = from p in db.Persona
                                    where p.TipoPersona == 1
                                    orderby p.RUC
                                    select p;
                List<Persona> dbProveedoresList = dbProveedores.ToList();
                for (int i = 0; i < dbProveedoresList.Count(); i++)
                {
                    dbProveedoresList[i].RazonSocial = dbProveedoresList[i].RUC + " " + dbProveedoresList[i].RazonSocial;
                }
                ViewBag.IDPersona_Proveedor = new SelectList(dbProveedoresList, "IDPersona", "RazonSocial");
                return View(ordencompra);
            }
            // -----               ------

            decimal subtotal = 0;
            ordencompra.Fecha = DateTime.Now;
            ordencompra.IGV = (decimal)0.19;
            ordencompra.Total = ordencompra.Subtotal + ordencompra.IGV;
            ordencompra.IDPersona_Proveedor = (int)Session["ordenCompraProveedorID"];
            ordencompra.IDTerminal = idTerminal; // trabajador que registra
            ordencompra.Estado = "AC";
            if (ModelState.IsValid)
            {
                //Ahora guardamos los detalles de la orden de compra
                for(int i=0; i<((List<Detalle_OrdenCompra>)Session["listaCompraDetalle"]).Count(); i++){
                    ((List<Detalle_OrdenCompra>)Session["listaCompraDetalle"]).ElementAt(i).IDOrdenCompra = ordencompra.IDOrdenCompra;
                    db.Detalle_OrdenCompra.Add(((List<Detalle_OrdenCompra>)Session["listaCompraDetalle"]).ElementAt(i));
                    subtotal = subtotal + ((List<Detalle_OrdenCompra>)Session["listaCompraDetalle"]).ElementAt(i).Subtotal.Value;
                }
                ordencompra.Subtotal = subtotal;
                ordencompra.IGV = System.Decimal.Multiply((decimal)0.19,subtotal);
                ordencompra.Total = System.Decimal.Add(ordencompra.Subtotal.Value, ordencompra.IGV.Value);
                db.OrdenCompra.Add(ordencompra);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.IDPersona_Proveedor = new SelectList(db.Persona, "IDPersona", "Nombre", ordencompra.IDPersona_Proveedor);
            ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre", ordencompra.IDTerminal);
            return View(ordencompra);
        }

        // GET: /OrdenCompra/Edit/5
        public ActionResult Edit(int? id)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            OrdenCompra ordencompra = db.OrdenCompra.Find(id);
            if (ordencompra == null)
            {
                return HttpNotFound();
            }
            ViewBag.IDPersona_Proveedor = new SelectList(db.Persona, "IDPersona", "RazonSocial", ordencompra.IDPersona_Proveedor);
            ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre", ordencompra.IDTerminal);
            return View(ordencompra);
        }

        // POST: /OrdenCompra/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include="IDOrdenCompra,Fecha,Subtotal,IGV,Total,Estado,IDPersona_Proveedor,IDPersona")] OrdenCompra ordencompra)
        {
            if (ModelState.IsValid)
            {
                db.Entry(ordencompra).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.IDPersona_Proveedor = new SelectList(db.Persona, "IDPersona", "Nombre", ordencompra.IDPersona_Proveedor);
            ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre", ordencompra.IDTerminal);
            return View(ordencompra);
        }

        // GET: /OrdenCompra/Delete/5
        public ActionResult Delete(int? id)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------

            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            OrdenCompra ordencompra = db.OrdenCompra.Find(id);
            if (ordencompra.Estado == "AC")
            {
                ViewBag.strEstadoD = "ACTIVO";
            }
            else if (ordencompra.Estado == "IN")
            {
                ViewBag.strEstadoD = "INACTIVO";
            }
            else if (ordencompra.Estado == "PG")
            {
                ViewBag.strEstadoD = "Pagado";
            }
            else if (ordencompra.Estado == "RG")
            {
                ViewBag.strEstadoD = "REGISTRADO";
            }
            if (ordencompra == null)
            {
                return HttpNotFound();
            }
            return View(ordencompra);
        }

        // POST: /OrdenCompra/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------

            OrdenCompra ordencompra = db.OrdenCompra.Find(id);
            ordencompra.Estado = "IN";
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private ActionResult ValidarSeguridad()
        {

            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.COMPRAS))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            return null;
        }
    }
}
